#include "stm32f10x.h"
#include "usart.h"
void usart_init(u32 bound){
    //1.时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    //GPIO初始化
    GPIO_InitTypeDef init_def;
    init_def.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入  读取数据
    init_def.GPIO_Pin=GPIO_Pin_10;
    init_def.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&init_def);
    init_def.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
    init_def.GPIO_Pin=GPIO_Pin_9;
    GPIO_Init(GPIOA,&init_def);
    //对usart配置 初始化
    USART_InitTypeDef usartInit;
    usartInit.USART_BaudRate=bound;//波特率设置
    usartInit.USART_WordLength=USART_WordLength_8b;//字长为8位数据格式9位是有一个奇偶校验位
    usartInit.USART_StopBits=USART_StopBits_1;//1个停止位
    usartInit.USART_Parity=USART_Parity_No;//无奇偶校验位
    usartInit.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制
    usartInit.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//发送使能和接收使能都要
    USART_Init(USART1,&usartInit);
    USART_Cmd(USART1,ENABLE);//使能或者失能 USART 外设
    //清空一下中断状态位
    USART_ClearFlag(USART1,USART_FLAG_RXNE);// 先清理一次标记
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
    //3.初始化NVIC
    NVIC_InitTypeDef nvicInit;//只是改了一下这里
    nvicInit.NVIC_IRQChannel=USART1_IRQn;
    nvicInit.NVIC_IRQChannelCmd=ENABLE;
    nvicInit.NVIC_IRQChannelPreemptionPriority=2;
    nvicInit.NVIC_IRQChannelSubPriority=3;
    NVIC_Init(&nvicInit);
}

/*
     最高位 是是否接收完毕状态位
     1000  0000  0000  0000   =0x8000
     次高位 是否接收到回车状态位
     0100  0000  0000  0000   =0x4000

     0011  1111  1111  1111   =0x3FFF
                                             
什么时候数据是接受完毕：接收到了一个/r/n  数据接受完毕
     回车=0x0D
     换行=0x0a

*/
u16 USART1_RX_STA=0;  //用来去记录数据接收后再数据中存放的位置
u8 USART1_RX_BUF[USART1_REC_LEN]; //只是用来缓存接收到的数据

/*
 如果发送方 发送数据中间出现了换行 
 
 hello？/r
 world
\r 代表 回车（Carriage Return），作用是将光标移动到当前行的开头。
\n 代表 换行（Line Feed），作用是将光标移动到下一行。

*/

//中断处理函数
void USART1_IRQHandler(){
    u8 r;//记录接收到的数据
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
	{
		r =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		if((USART1_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART1_RX_STA&0x4000)//接收到了0x0d
			{
				if(r!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
				else USART1_RX_STA|=0x8000;	//接收完成了 
			}
			else //还没收到0X0D
			{	
				if(r==0x0d)USART1_RX_STA|=0x4000;
				else
				{
					USART1_RX_BUF[USART1_RX_STA&0X3FFF]=r;
					USART1_RX_STA++;
					if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}   		 
	} 
    
}
